local PatchCode = {}

local _loadstring = loadstring

function PatchCode.loadPatchCode(code)
	if code == nil or code == "" then
		return
	end

	--
	local patchFunction = assert(_loadstring(code))
	if patchFunction ~= nil and type(patchFunction) == "function" then
		patchFunction()
	end
end

-- require()增强版，动态更新模块代码，解决已经引用模块的地方不会得到更新。
function PatchCode.reload(module)
	-- 解决已经引用模块的不会得到更新
	local ori_module = package.loaded[module]

	-- 判断是否曾经加载过此模块
	if package.loaded[module] then
		logWarn(module)
	end

	-- 将该模块原来在表中注册的值清空
	package.loaded[module] = nil
	-- 再次调用require进行模块加载和注册
	require(module)

	-- 将引用该模块的地方的值也做对应更新
	local new_module = package.loaded[module]
	if ori_module then
		for k, v in pairs(new_module) do
			ori_module[k] = v
		end
		package.loaded[module] = ori_module
	end
	return new_module
end

function PatchCode.doHotPath()
	local filePath = PatchCode.reload("reload")
	for k, path in pairs(filePath) do
		PatchCode.reload(path)
	end
end

return PatchCode